home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / townsmsx / tif2scc.c < prev    next >
Text File  |  1994-06-01  |  14KB  |  585 lines

  1. /*********************************************************************
  2.  
  3.            FM-TOWNS TIFF FILE -> MSX SCREEN12 BSAVE FILE 
  4.                 by ちにゃと    (NIFTY-Serve ID:GFH01000)
  5.  
  6.                     1993/12/07       Ver 2.1 L20            
  7.  
  8. ********************************************************************/
  9.  
  10.                      
  11. #include <io.h>
  12. #include <fcntl.h>
  13. #include <stat.h>
  14. #include <memory.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <conio.h>
  19. #include <dos.h>
  20. #include <mos.h>
  21. #include <math.h>
  22. #include <stat.h>
  23.  
  24. /* T-BIOS C ライブラリ ヘッダー */
  25. #include <fmcfrb.h>
  26.  
  27. char tifheader[512];
  28. char scchead[10] ={
  29. 0xfe,0x00,0x00,0xff,0xd3,0x00,0x00
  30. };
  31. char readbuf[2432];
  32. char fname[256];
  33. char filepath[256];
  34. char tifext[10];
  35. char sccdata[256*64][4];
  36. char tifdata[256*64][8];
  37. char wildfname[100][256];
  38. unsigned char r[5];
  39. unsigned char g[5];
  40. unsigned char b[5];
  41. unsigned char y[5];
  42. unsigned char k,kj;
  43. int rshift,gshift,bshift,xshift,yshift;
  44. unsigned long int tif_x_size,tif_y_size,tifsize;
  45. unsigned long int copy_x_size,copy_y_size;
  46. int i,j,wildcard;
  47. int tagp;
  48. int w_ret;
  49. int mode;
  50. int fileno;
  51. int namelen;
  52. int flong;
  53. int findflag;
  54. int wildct;
  55. static struct find_t wildfbuf;
  56. static unsigned long ret,pan;
  57.  
  58. /************************************************************
  59. 【オプション解析】
  60.  
  61.         概要    オプションパラメ-タの解析を行い結果を返す
  62.         用法    optionset( argc, *argv[] );
  63.         引数    int        argc
  64.                 char    *argv[]
  65.         戻り値     int        0    正常終了
  66.                         -1    オプションの指定が正しくない
  67. ************************************************************/
  68.  
  69. int optionset( int argc, char *argv[] ){
  70.  
  71.     int        count;
  72.     char    c;
  73.     ret=0;
  74.  
  75.     strcpy(tifext,"TIF");
  76.     rshift=0;
  77.     gshift=0;
  78.     bshift=0;    
  79.     ret = 0;
  80.     findflag=0;
  81.     /* オプション パラメータ 解析 */
  82.     if ( argc == 1 ) {
  83.         ret=-1;
  84.     } 
  85.     else{
  86.         for ( count = 1; count < argc; count++ ){
  87.             c = *argv[count];                        /* 先頭文字 get */
  88.             if ( c == '/' || c == '-' ){
  89.                 c = *(argv[count] + 1);                /* 2 文字目 get */
  90.                 switch ( c ){
  91.                     case 'h':
  92.                     case 'H':
  93.                     case '?':
  94.                         ret = -1;
  95.                         break;
  96.  
  97.                     case 'x':
  98.                     case 'X':
  99.                         xshift = *(argv[count] + 2);
  100.                         xshift -= 0x30; 
  101.                         if ((*(argv[count] + 3)>0x2f) &&
  102.                                 (*(argv[count] + 3)<0x3a)   ){
  103.                             xshift=xshift*10+(*(argv[count] + 3))-0x30;
  104.                         }
  105.                         if ((*(argv[count] + 4)>0x2f) &&
  106.                                 (*(argv[count] + 4)<0x3a)   ){
  107.                             xshift=xshift*10+(*(argv[count] + 4))-0x30;
  108.                         }
  109.                         break;
  110.  
  111.                     case 'y':
  112.                     case 'Y':
  113.                         yshift = *(argv[count] + 2);
  114.                         yshift -= 0x30; 
  115.                         if ((*(argv[count] + 3)>0x2f) &&
  116.                                 (*(argv[count] + 3)<0x3a)   ){
  117.                             yshift=yshift*10+(*(argv[count] + 3))-0x30;
  118.                         }
  119.                         if ((*(argv[count] + 4)>0x2f) &&
  120.                                 (*(argv[count] + 4)<0x3a)   ){
  121.                             yshift=yshift*10+(*(argv[count] + 4))-0x30;
  122.                         }
  123.                         break;
  124.  
  125.                     case 'r':
  126.                     case 'R':
  127.                         rshift = *(argv[count] + 2);
  128.                         rshift -= 0x30; 
  129.                         if ((*(argv[count] + 3)>0x30) &&
  130.                                 (*(argv[count] + 3)<0x34)   ){
  131.                             rshift=rshift*10+(*(argv[count] + 3))-0x30;
  132.                         }
  133.                         break;
  134.  
  135.                     case 'g':
  136.                     case 'G':
  137.                         gshift = *(argv[count] + 2);
  138.                         gshift-=0x30;
  139.                         if ((*(argv[count] + 3)>0x30) &&
  140.                                 (*(argv[count] + 3)<0x34)   ){
  141.                             gshift=gshift*10+(*(argv[count] + 3))-0x30;
  142.                         }
  143.                         break;
  144.  
  145.                     case 'b':
  146.                     case 'B':
  147.                         bshift = *(argv[count] + 2);
  148.                         bshift-=0x30;
  149.                         if ((*(argv[count] + 3)>0x30) &&
  150.                                 (*(argv[count] + 3)<0x34)   ){
  151.                             bshift=bshift*10+(*(argv[count] + 3))-0x30;
  152.                         }
  153.                         break;
  154.  
  155.                       /* 無効 パラメータ */
  156.                     default:
  157.                     ret = -1;
  158.                 }        /* <switch> */
  159.             }
  160.             else{
  161.                    strcpy(fname, argv[count] );
  162.              }
  163.         }    /* <for> */
  164.       }
  165.     if(ret==-1){
  166.         printf("****************************************************\n");
  167.         printf("     FM-TOWNS TIFF FILE ->MSX SCREEN12 BSAVE FILE\n");
  168.         printf("        by ちにゃと    (NIFTY-Serve ID:GFH01000)\n");
  169.         printf("            1993/12/07       Ver 2.1 L20        \n");
  170.         printf("****************************************************\n");
  171.         printf("\n");
  172.         printf("用法) RUN386  TIF2SCC.EXP [-Rx] [-Gx] [-Bx] [-Xx] [-Yx] FILENAME\n");
  173.         printf("\n");
  174.         printf("-Rx -Gx -Bx   RGBの強さを調整  x=0~31 \n");
  175.         printf("              省略時は -R0 -G0 -B0\n");
  176.         printf("              \n");
  177.         printf("\n");
  178.         printf("-Xx -Yx       取り込み位置の左上角の座標   \n");
  179.         printf("\n");
  180.         printf("\n");
  181.         printf("FILENAME      拡張子が .TIF  のみ\n");
  182.         printf("              ワイルドカ-ドも指定可能\n");
  183.         printf("\n");
  184.         printf("ex1)  RUN386 TIF2SCC.EXP SAMPLE.TIF\n");
  185.         printf("ex2)  RUN386 TIF2SCC.EXP A:*.TIF\n");
  186.         printf("ex3)  RUN386 TIF2SCC.EXP A:\\SCC\\SAMPLE*.TIF\n");
  187.         return(-1);
  188.     }
  189.     namelen=strlen(fname);
  190.     flong=namelen;
  191.     for ( i =namelen-1; (i+1)>0 ;i-- ){
  192.         fname[i]=toupper(fname[i]);
  193.     }
  194.     for ( i =namelen-1; (i+1)>0 ;i-- ){
  195.         if ( fname[i] != 0x5c ){
  196.             flong -= 1;
  197.         }
  198.         else {
  199.             findflag=1;
  200.             break;
  201.         }
  202.     }
  203.     if(findflag==0){
  204.         flong=1;
  205.         for ( i = 0; i <255 ;i ++ ){
  206.             if ( fname[i] != 0x3a ){
  207.                 flong += 1;
  208.             }
  209.             else {
  210.                 findflag=2;
  211.                 break;
  212.             }
  213.         }
  214.     }
  215.     if(findflag!=0){
  216.         strncpy( filepath,fname,flong );
  217.     }
  218.     flong =strlen(fname);
  219.     for (i=0;i<3;i++){
  220.         if(fname[flong-3+i]!=tifext[i]&&fname[flong-3+i]!=(tifext[i]+0x20))
  221.         {
  222.             printf("拡張子が .TIF でありません。\n");
  223.             return(-1);
  224.         }
  225.     }
  226.     return ret;
  227. }
  228. /************************************************************
  229.  
  230.                         tifload
  231.  
  232. ************************************************************/
  233. int tifload()
  234.  
  235. {
  236. char fname2[256];
  237.  
  238. strcpy(fname2,fname);
  239. printf("%s  ",fname);
  240.  
  241.     clrwork();
  242.     if (_access(fname2,0) !=0 ){
  243.         printf("no tif file");
  244.         return(-1);
  245.     }
  246.     else{
  247.         pan=_open(fname2,_O_BINARY | _O_RDWR );
  248.         if (pan== -1 ){
  249.             return(-1);
  250.         }
  251.         ret=_read(pan,tifheader,512);
  252.         if (ret== -1){
  253.             _close(pan);
  254.             return(-1);
  255.         }
  256.         else{
  257.             if(tifheader[0]!=0x49||tifheader[1]!=0x49||
  258.                 tifheader[4]!=0x08                        ){
  259.                 printf("モトロ-ラ-形式TIFFはコンバ-ト出来ません。\n");
  260.                 _close(pan);
  261.                 return(-1);
  262.             }
  263.             tagp=0x0a;
  264.             for(i=0;i<tifheader[0x08];i++){
  265.                 if(    tifheader[0x0a+i*12]==0x03 && 
  266.                     tifheader[0x0b+i*12]==0x01        ){
  267.                     tagp+=i*12;
  268.                     break;
  269.                 }
  270.             }
  271.             if(tagp==0x0a){
  272.                 printf("Complessタグが見つかりません。\n");
  273.                 _close(pan);
  274.                 return(-1);
  275.             }
  276.             tagp+=8;            
  277.             if(tifheader[tagp]!=0x01){
  278.                 printf("圧縮TIFFはコンバ-ト出来ません。\n");
  279.                 _close(pan);
  280.                 return(-1);
  281.             }
  282.             tagp=0x0a;
  283.             for(i=0;i<tifheader[0x08];i++){
  284.                 if(    tifheader[0x0a+i*12]==0x02 && 
  285.                     tifheader[0x0b+i*12]==0x01        ){
  286.                     tagp+=i*12;
  287.                     break;
  288.                 }
  289.             }
  290.             if(tagp==0x0a){
  291.                 printf("BitPerPixelタグが見つかりません。\n");
  292.                 _close(pan);
  293.                 return(-1);
  294.             }
  295.             tagp+=8;            
  296.             if(tifheader[tagp]!=0x10){
  297.                 printf("32K色TIFF以外はコンバ-ト出来ません。\n");
  298.                 _close(pan);
  299.                 return(-1);
  300.             }
  301.             tagp=0x0a;
  302.             for(i=0;i<tifheader[0x08];i++){
  303.                 if(    tifheader[0x0a+i*12]==0x00 && 
  304.                     tifheader[0x0b+i*12]==0x01        ){
  305.                     tagp+=i*12;
  306.                     break;
  307.                 }
  308.             }
  309.             if(tagp==0x0a){
  310.                 printf("ImegeWidthタグが見つかりません。\n");
  311.                 _close(pan);
  312.                 return(-1);
  313.             }
  314.             tagp+=8;            
  315.             tif_x_size=tifheader[tagp+2]*256*256+
  316.                     tifheader[tagp+1]*256+tifheader[tagp];
  317.             tagp=0x0a;
  318.             for(i=0;i<tifheader[0x08];i++){
  319.                 if(    tifheader[0x0a+i*12]==0x01 && 
  320.                     tifheader[0x0b+i*12]==0x01        ){
  321.                     tagp+=i*12;
  322.                     break;
  323.                 }
  324.             }
  325.             if(tagp==0x0a){
  326.                 printf("ImegeLengthタグが見つかりません。\n");
  327.                 _close(pan);
  328.                 return(-1);
  329.             }
  330.             tagp+=8;            
  331.             tif_y_size=tifheader[tagp+2]*256*256+
  332.                     tifheader[tagp+1]*256+tifheader[tagp];
  333.  
  334.             if(xshift>=tif_x_size || yshift>=tif_y_size ){
  335.                 printf("指定座標が大きすぎます。MAX_X=%4d MAX_Y=%4d\n"
  336.                         ,tif_x_size-1,tif_y_size-1 );
  337.                 _close(pan);
  338.                 return(-1);
  339.             } 
  340.             tifsize=512;
  341.             copy_x_size=512;
  342.             if((xshift+256)>tif_x_size ){
  343.                 copy_x_size=tif_x_size-xshift;
  344.             } 
  345.             copy_y_size=212;
  346.             if( (yshift+212)>tif_y_size ){
  347.                 copy_y_size=tif_y_size-yshift;
  348.             } 
  349.             for(i=0 ;i<copy_y_size+yshift ;i++ ){
  350.                 ret = _read(pan,&readbuf[0],tif_x_size*2);
  351.                 if (ret == -1 ){
  352.                     _close(pan);
  353.                     printf("読み込みエラ-が発生しました。\n");
  354.                     return(-1);
  355.                 }
  356.                 else{
  357.                     if(i>=yshift){
  358.                         tifsize+=tif_x_size*2;
  359.                         memcpy(&tifdata[64*(i-yshift)][0]
  360.                                 ,&readbuf[xshift*2],copy_x_size*2);
  361.                     }    
  362.                 }
  363.             }
  364.             _close(pan);
  365.         }
  366.     }
  367.     return(0);
  368. }
  369. /***************************************************************
  370. 【デ-タファイルを作成する】
  371.  
  372.         概要    
  373.         用法    sccsave();
  374.         引数    無し
  375. ***************************************************************/
  376.  
  377. int sccsave ( void )
  378. {
  379.     char fname2[256];
  380.     int        wsize;
  381.     flong = 0;
  382.  
  383.     for ( i = 0; i <251 ;i ++ ){
  384.         if ( fname[i] != 0x2e ){
  385.             flong += 1;
  386.         }
  387.         else {
  388.             break;
  389.         }
  390.     }
  391.     strncpy( fname2,fname,flong );
  392.     fname2[flong]=0x00;
  393.     strcat( fname2,".SCC");
  394.     fname2[flong+4]=0x00;
  395.  
  396.  
  397.  
  398.     if ( _access( fname2, 0 ) == 0 ) {
  399.         printf( " 同名のファイルがあります。上書きします。" );
  400.         ret = _unlink ( fname2 );
  401.     }
  402.     ret = 0;
  403.     pan = _open( fname2,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
  404.     if ( pan == -1) {
  405.         printf("  書き込みのオ-プンに失敗しました。 \n" );
  406.         ret = -1;
  407.     }
  408.     if ( ret == 0 ) {
  409.         wsize = _write( pan, &scchead[0], 7 );
  410.         if ( wsize == -1 || wsize != 7 ) {
  411.             printf("  ヘッダ書き込みに失敗しました。\n" );
  412.             _close( pan );
  413.             return(-1);
  414.         }
  415.         else{
  416.  
  417.             wsize = _write( pan, &sccdata[0][0], 256*212  );
  418.             if ( wsize == -1 || wsize != 256*212 ) {
  419.                 printf("  デ-タ書き込みに失敗しました。\n" );
  420.                 _close( pan );
  421.                 return(-1);
  422.             }
  423.             else{
  424.                 printf("\n");
  425.             }
  426.         }
  427.     }
  428.     return (0);
  429. }
  430.  
  431.  
  432. /*********************************************************
  433.  
  434.                           clrwork
  435.                           
  436. *********************************************************/
  437. int clrwork(){
  438.     for(i=0;i<256*64;i++){
  439.         for(j=0;j<8;j++){
  440.             tifdata[i][j]=0;
  441.         }
  442.         for(j=0;j<4;j++){
  443.             sccdata[i][j]=0;
  444.         }
  445.     }
  446.     return(0);
  447. }
  448.  
  449. /*********************************************************
  450.  
  451.                           convert
  452.                           
  453. *********************************************************/
  454. int convert(){
  455.     for(i=0;i<13568;i++){
  456.         for(j=0;j<4;j++){
  457.             b[j]=(tifdata[i][j*2+0] & 0x1f)+bshift;
  458.             g[j]=(tifdata[i][j*2+1] & 0x7c)/4+gshift;
  459.             r[j]=(tifdata[i][j*2+0]&0xe0)/32+
  460.                  (tifdata[i][j*2+1]&0x03)*8+rshift;
  461.             y[j]=(b[j]+1)/2+(r[j]+1)/4+(g[j]+1)/8;
  462.         }
  463.         g[4]=(g[0]+g[1]+g[2]+g[3])/4;
  464.         r[4]=(r[0]+r[1]+r[2]+r[3])/4;
  465.         b[4]=(b[0]+b[1]+b[2]+b[3])/4;
  466.         y[4]=(b[4]+1)/2+(r[4]+1)/4+(g[4]+1)/8;
  467.         kj=r[4]-y[4];
  468.         k=g[4]-y[4];
  469.         if((kj & 0x80)!=0){
  470.             kj=kj & 0x3f;
  471.         }
  472.         if((k & 0x80)!=0){
  473.             k=k & 0x3f;
  474.         }
  475.         sccdata[i][0]=y[0]*8+(k & 0x07);
  476.         sccdata[i][1]=y[1]*8+(k / 8);
  477.         sccdata[i][2]=y[2]*8+(kj & 0x07);
  478.         sccdata[i][3]=y[3]*8+(kj / 8);
  479.     }
  480.     return(0);
  481. }
  482.  
  483. /*********************************************************
  484.  
  485.                           メイン
  486.  
  487. *********************************************************/
  488.  
  489.  
  490. void main( int argc, char *argv[] ){
  491.     fileno=0;
  492.     mode=0x16;
  493.     if(optionset( argc, argv )!=0){
  494.         exit(-1);
  495.     }
  496.     for ( i = 0; i <251 ;i ++ ){
  497.         if ( fname[i] != 0x2a ){
  498.             flong += 1;
  499.         }
  500.         else {
  501.             wildcard=1;
  502.             break;
  503.         }
  504.     }
  505.     if(wildcard==1){
  506.         w_ret=_dos_findfirst((char*)fname,mode,&wildfbuf);
  507.         if(w_ret){
  508.             printf("指定のワイルドカ-ドが見つかりません\n");
  509.             exit(-1);
  510.         }
  511.         else{
  512.             strcpy(wildfname[fileno],wildfbuf.name);
  513.             fileno++;
  514.             for (;;){
  515.                 w_ret=_dos_findnext(&wildfbuf);
  516.                 if(w_ret){
  517.                     break;
  518.                 }
  519.                 strcpy(wildfname[fileno],wildfbuf.name);
  520.                 fileno++;
  521.             }
  522.         }
  523.         for(wildct=0;wildct<fileno;wildct++){
  524.             strcpy(fname,filepath);
  525.             strcat(fname,wildfname[wildct]);
  526.              if(tifload()!=0){
  527.                 exit(-1);
  528.             }
  529.             if(convert()!=0){
  530.                 exit(-1);
  531.             }
  532.             strcpy(fname,wildfname[wildct]);
  533.             if(sccsave()!=0){
  534.                 exit(-1);
  535.             }
  536.         }
  537.     }
  538.     else{
  539.     
  540.     
  541.     
  542.         if(tifload()!=0){
  543.             exit(-1);
  544.         }
  545.         if(convert()!=0){
  546.             exit(-1);
  547.         }
  548.         findflag=0;
  549.         namelen=strlen(fname);
  550.         flong=namelen;
  551.         for ( i =namelen-1; (i+1)>0 ;i-- ){
  552.             if ( fname[i] != 0x5c ){
  553.                 flong -= 1;
  554.             }
  555.             else {
  556.                 findflag=1;
  557.                 break;
  558.             }
  559.         }
  560.         if(findflag==0){
  561.             flong=1;
  562.             for ( i = 0; i <255 ;i ++ ){
  563.                 if ( fname[i] != 0x3a ){
  564.                     flong += 1;
  565.                 }
  566.                 else {
  567.                     findflag=2;
  568.                     break;
  569.                 }
  570.             }
  571.         }
  572.         if(findflag!=0){
  573.             for(i=flong;i<namelen;i++){
  574.                 fname[i-flong]=fname[i];
  575.             }
  576.             fname[i-flong]=0;
  577.         }
  578.         
  579.         if(sccsave()!=0){
  580.             exit(-1);
  581.         }
  582.     }
  583.     exit(0);
  584. }
  585.